package com.deng.hadoop.mapreduce;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;
import java.util.StringTokenizer;

/**
 * Created By DengLibin
 * Date: 19-4-1
 * Time: 上午9:33
 * Desc: 单词计数mapper 输出：key(单词,Text类型)-value(数量1次，IntWritable类型)
 */
public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {

    private final IntWritable one = new IntWritable(1);//value对象 可复用
    private Text word = new Text(); //key对象 可复用

    /**
     * 一个文件被分成多个块，进行map时，文件会被进行切片，默认切片的大小和块的大小一致，可通过FileInputFormat设置切片的大小
     * 一个切片（Split）对应一个map程序（调map方法）。
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        //super.map(key, value, context); 父类直接就将key,value写出去了，没有任何加工
        StringTokenizer stn = new StringTokenizer(value.toString());
        while (stn.hasMoreTokens()) {
            word.set(stn.nextToken()); //设置key的值
            context.write(word, one);
        }
    }
}
